package com.sy.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * @author maojq
 * @date 2020/11/27 0027 21:18
 */
public class AliOssUtil {
    /**
     * Endpoint以杭州为例，其它Region请按实际情况填写。  上传照片的服务器地址，根据地址选择
     */
    private final static String ENDPOINT = "http://oss-cn-hangzhou.aliyuncs.com";


    // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
    private final static String KEY = "LTAI4G78rwXN4VJ5Pba56Sov";
    private final static String KEYSECRET = "BCyEClPLjoyqBArZ4TYUmeFvXZQR66";
    /**
     * 客户端
     */
    private static OSS client;
    /**
     * 默认日期
     */
    private static final int DEFAULT_DAYS = 30;

    /**
     * 创建client实例
     */
    static {
        client = new OSSClientBuilder().build(ENDPOINT, KEY, KEYSECRET);
    }


    /**
     * 创建存储空间
     */
    public static boolean createB(String name) {
        //1.判断参数不为空
        if (null != name){
            //2.判断存储空间名字唯一
            if (client.doesBucketExist(name)) {
                //3.创建存储空间
                client.createBucket(name);
                return true;
            }
        }
        return false;
    }

    /**
     * 展示所有存储空间
     */
    public static List<String> listB() {
        //1.将数组 listBuckets 展示  不能直接输出存储空间名称
        List<Bucket> buckets = client.listBuckets();
        //2.创建新数据用来接收存储空间名称
        ArrayList<String> list = new ArrayList<>(buckets.size());
        for (Bucket bucket : buckets) {
            //3.将名称添加到list集合中
            list.add(bucket.getName());
        }
        return list;
    }


    /**
     *  上传内容
     * @param bname 存储空间名称
     * @param objname 对象名称
     * @param data 数据，要保存的内容
     * @return
     */
    public static String upload(String bname, String objname, byte[] data) {
        //文件上传
        client.putObject(bname, objname, new ByteArrayInputStream(data));
        //生成访问地址
        return createURL(bname, objname, DEFAULT_DAYS);
    }


    /**
     *上传内容
     * @param bname 存储空间的名称
     * @param objname 对象名称
     * @param days 访问的链接的有效期
     * @param data 要保存的内容
     * @return
     */
    public static String upload(String bname, String objname, int days, byte[] data) {
        //文件上传
        client.putObject(bname, objname, new ByteArrayInputStream(data));
        //生成访问地址
        return createURL(bname, objname, days);
    }


    private static String createURL(String bname, String objname, int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH, days);

        /*
         * 生成访问地址
         * 参数说明
         * 1.存储空间名称
         * 2.对象名称
         * 3.访问地址的有效期
         */
        return client.generatePresignedUrl(bname, objname, calendar.getTime()).toString();
    }
}
